package classesInterface;

import classesBancodeDados.FichaAdmissaoMedica;
import classesBancodeDados.FichaAtendPsiqUrgencia;
import classesBancodeDados.FichaClinicaMedica;
import classesBancodeDados.FichaEncInternHospPsiq;
import classesBancodeDados.FichaEncaminhamentoEgresso;
import classesBancodeDados.FichaEncaminhamentoRede;
import classesBancodeDados.FichaEvolMultidisciplinar;
import classesBancodeDados.FichaEvolRelTecEnferm;
import classesBancodeDados.FichaHistEnfermagem;
import classesBancodeDados.FichaInternamento;
import classesBancodeDados.FichaLaudoAutorInternHosp;
import classesBancodeDados.FichaNotificacaoInfeccao;
import classesBancodeDados.FichaObservacaoPA;
import classesBancodeDados.FichaPrescClinMedica;
import classesBancodeDados.FichaPrescricaoMedDoseIndiv;
import classesBancodeDados.FichaProjTerapIndividual;
import classesBancodeDados.FichaSistematizacaoAssistEnf;
import classesBancodeDados.Paciente;
import classesBancodeDados.Pessoa;
import classesJpa.FichaAdmissaoMedicaJpaController;
import classesJpa.FichaAtendPsiqUrgenciaJpaController;
import classesJpa.FichaClinicaMedicaJpaController;
import classesJpa.FichaEncInternHospPsiqJpaController;
import classesJpa.FichaEncaminhamentoEgressoJpaController;
import classesJpa.FichaEncaminhamentoRedeJpaController;
import classesJpa.FichaEvolMultidisciplinarJpaController;
import classesJpa.FichaEvolRelTecEnfermJpaController;
import classesJpa.FichaHistEnfermagemJpaController;
import classesJpa.FichaInternamentoJpaController;
import classesJpa.FichaLaudoAutorInternHospJpaController;
import classesJpa.FichaNotificacaoInfeccaoJpaController;
import classesJpa.FichaObservacaoPAJpaController;
import classesJpa.FichaPrescClinMedicaJpaController;
import classesJpa.FichaPrescricaoMedDoseIndivJpaController;
import classesJpa.FichaProjTerapIndividualJpaController;
import classesJpa.FichaSistematizacaoAssistEnfJpaController;
import classesJpa.PacienteJpaController;
import classesJpa.exceptions.PreexistingEntityException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;

public class JanelaProntuario extends javax.swing.JFrame {

    /**
     * Creates new form JanelaProntuario
     */
    private JanelaProntuario() {
        paciente = null;
        initComponents();
    }
    
    public static JanelaProntuario getInstance(){
        if(uniqueInstance == null){
            uniqueInstance = new JanelaProntuario();
        }
        return uniqueInstance;
    }

    public Paciente getPaciente() {
        return paciente;
    }

    public void setPaciente(Paciente paciente) {
        this.paciente = paciente;
    }

    public Pessoa getPessoa() {
        return pessoa;
    }

    public void setPessoa(Pessoa pessoa) {
        this.pessoa = pessoa;
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        jPanel2 = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();
        jMenu3 = new javax.swing.JMenu();
        jMenuItem12 = new javax.swing.JMenuItem();
        jMenuItem1 = new javax.swing.JMenuItem();
        jMenuItem2 = new javax.swing.JMenuItem();
        jMenuItem3 = new javax.swing.JMenuItem();
        jMenu2 = new javax.swing.JMenu();
        jMenuItem5 = new javax.swing.JMenuItem();
        jMenuItem7 = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null},
                {null, null},
                {null, null},
                {null, null}
            },
            new String [] {
                "Nome", "Nº SUS"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.String.class, java.lang.String.class
            };
            boolean[] canEdit = new boolean [] {
                false, false
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        jScrollPane1.setViewportView(jTable1);

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 488, Short.MAX_VALUE)
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 319, Short.MAX_VALUE)
        );

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );

        jMenu1.setText("Prontuário");

        jMenu3.setText("Criar");

        jMenuItem12.setText("Paciente");
        jMenuItem12.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem12ActionPerformed(evt);
            }
        });
        jMenu3.add(jMenuItem12);

        jMenuItem1.setText("Pronto Atendimento");
        jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem1ActionPerformed(evt);
            }
        });
        jMenu3.add(jMenuItem1);

        jMenuItem2.setText("Internação");
        jMenuItem2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem2ActionPerformed(evt);
            }
        });
        jMenu3.add(jMenuItem2);

        jMenu1.add(jMenu3);

        jMenuItem3.setText("Editar");
        jMenuItem3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem3ActionPerformed(evt);
            }
        });
        jMenu1.add(jMenuItem3);

        jMenuBar1.add(jMenu1);

        jMenu2.setText("Pesquisar");

        jMenuItem5.setText("Por Nome");
        jMenuItem5.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem5ActionPerformed(evt);
            }
        });
        jMenu2.add(jMenuItem5);

        jMenuItem7.setText("Por CPF");
        jMenuItem7.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem7ActionPerformed(evt);
            }
        });
        jMenu2.add(jMenuItem7);

        jMenuBar1.add(jMenu2);

        setJMenuBar(jMenuBar1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void cadastraNovoProntuarioPA(Paciente p){
        try {
            FichaObservacaoPA fopa = new FichaObservacaoPA();
            FichaHistEnfermagem fhist = new FichaHistEnfermagem();
            FichaEvolMultidisciplinar fmulti = new FichaEvolMultidisciplinar();
            FichaSistematizacaoAssistEnf fsisenf = new FichaSistematizacaoAssistEnf();
            FichaPrescricaoMedDoseIndiv fdose = new FichaPrescricaoMedDoseIndiv();
            FichaEvolRelTecEnferm fenf = new FichaEvolRelTecEnferm();
            FichaNotificacaoInfeccao finfec = new FichaNotificacaoInfeccao();
            
            DateFormat dateFormat = new SimpleDateFormat("ddMMyyyy");
            Date date = new Date();
            
            StringBuilder b = new StringBuilder("");
            
            b.append("p");
            b.append(dateFormat.format(date));
            b.append(p.getSus());
            
            String susp = b.toString();
            
            fopa.setNumeroProntuario(susp);
            fopa.setSus(p.getSus());
            
            fhist.setNumeroProntuario(susp);
            fhist.setSus(p.getSus());
            
            fmulti.setNumeroProntuario(susp);
            fmulti.setSus(p.getSus());
            
            fdose.setNumeroProntuario(susp);
            fdose.setSus(p.getSus());
            
            fenf.setNumeroProntuario(susp);
            fenf.setSus(p.getSus());
               
            finfec.setNumeroProntuario(susp);
            finfec.setSus(p.getSus());
            
            fsisenf.setNumeroProntuario(susp);
            fsisenf.setSus(p.getSus());
            
            System.out.println(fopa.toString());
            
            (new FichaObservacaoPAJpaController()).create(fopa);
            (new FichaHistEnfermagemJpaController()).create(fhist);
            (new FichaEvolMultidisciplinarJpaController()).create(fmulti);
            (new FichaPrescricaoMedDoseIndivJpaController()).create(fdose);
            (new FichaEvolRelTecEnfermJpaController()).create(fenf);
            (new FichaNotificacaoInfeccaoJpaController()).create(finfec);
            
        } catch (PreexistingEntityException ex) {
            Logger.getLogger(JanelaProntuario.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(JanelaProntuario.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }
    
    private void cadastraNovoProntuarioI(Paciente p){
        try {
            FichaAdmissaoMedica fadm = new FichaAdmissaoMedica();
            FichaAtendPsiqUrgencia fpsiq = new FichaAtendPsiqUrgencia();
            FichaClinicaMedica fclin = new FichaClinicaMedica();
            FichaEncInternHospPsiq fenc = new FichaEncInternHospPsiq();
            FichaEncaminhamentoEgresso fence = new FichaEncaminhamentoEgresso();
            FichaEncaminhamentoRede frede = new FichaEncaminhamentoRede();
            FichaEvolMultidisciplinar fmulti = new FichaEvolMultidisciplinar();
            FichaEvolRelTecEnferm fevo = new FichaEvolRelTecEnferm();
            FichaHistEnfermagem fhist = new FichaHistEnfermagem();
            FichaInternamento fintern = new FichaInternamento();
            FichaLaudoAutorInternHosp flaudo = new FichaLaudoAutorInternHosp();
            FichaNotificacaoInfeccao fnot = new FichaNotificacaoInfeccao();
            FichaPrescClinMedica fpres = new FichaPrescClinMedica();
            FichaPrescricaoMedDoseIndiv fpmdi = new FichaPrescricaoMedDoseIndiv();
            FichaProjTerapIndividual fproj = new FichaProjTerapIndividual();
            FichaSistematizacaoAssistEnf fsisenf = new FichaSistematizacaoAssistEnf();
            
            DateFormat dateFormat = new SimpleDateFormat("ddMMyyyy");
            Date date = new Date();
            
            StringBuilder b = new StringBuilder("");
            
            b.append("i");
            b.append(dateFormat.format(date));
            b.append(p.getSus());
            
            String susp = b.toString();
            
            fpmdi.setNumeroProntuario(susp);
            fpmdi.setSus(p.getSus());
            
            fpsiq.setNumeroProntuario(susp);
            fpsiq.setSus(p.getSus());
            
            flaudo.setNumeroProntuario(susp);
            flaudo.setSus(p.getSus());
            
            fintern.setNumeroProntuario(susp);
            fintern.setSus(p.getSus());
            
            fenc.setNumeroProntuario(susp);
            fenc.setSus(p.getSus());
            
            fadm.setNumeroProntuario(susp);
            fadm.setSus(p.getSus());
            
            fhist.setNumeroProntuario(susp);
            fhist.setSus(p.getSus());      
            
            fmulti.setNumeroProntuario(susp);
            fmulti.setSus(p.getSus());
            
            fevo.setNumeroProntuario(susp);
            fevo.setSus(p.getSus());
            
            fpres.setNumeroProntuario(susp);
            fpres.setSus(p.getSus()); 
            
            fclin.setNumeroProntuario(susp);
            fclin.setSus(p.getSus());
            
            fnot.setNumeroProntuario(susp);
            fnot.setSus(p.getSus());
            
            fproj.setNumeroProntuario(susp);
            fproj.setSus(p.getSus()); 
            
            fence.setNumeroProntuario(susp);
            fence.setSus(p.getSus());
            
            frede.setNumeroProntuario(susp);
            frede.setSus(p.getSus());
            
            fsisenf.setNumeroProntuario(susp);
            fsisenf.setSus(p.getSus()); 
            
            new FichaAtendPsiqUrgenciaJpaController().create(fpsiq);       
            new FichaLaudoAutorInternHospJpaController().create(flaudo);      
            new FichaInternamentoJpaController().create(fintern);      
            new FichaEncInternHospPsiqJpaController().create(fenc);      
            new FichaAdmissaoMedicaJpaController().create(fadm);      
            new FichaHistEnfermagemJpaController().create(fhist);      
            new FichaEvolMultidisciplinarJpaController().create(fmulti);      
            new FichaEvolRelTecEnfermJpaController().create(fevo);      
            new FichaPrescClinMedicaJpaController().create(fpres);      
            new FichaClinicaMedicaJpaController().create(fclin);      
            new FichaNotificacaoInfeccaoJpaController().create(fnot);      
            new FichaProjTerapIndividualJpaController().create(fproj);      
            new FichaEncaminhamentoEgressoJpaController().create(fence);      
            new FichaEncaminhamentoRedeJpaController().create(frede);      
            new FichaSistematizacaoAssistEnfJpaController().create(fsisenf);
            new FichaPrescricaoMedDoseIndivJpaController().create(fpmdi);
        } catch (PreexistingEntityException ex) {
            Logger.getLogger(JanelaProntuario.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(JanelaProntuario.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }
            
    
    private void cadastrarExistente(int tipo){
        
        String sus = JOptionPane.showInputDialog(this, "Digite o número do SUS do paciente", "Pergunta", JOptionPane.PLAIN_MESSAGE);
        
        PacienteJpaController pjc = new PacienteJpaController();
        
        paciente = pjc.findPacienteSus(sus);
        
        if(paciente == null){
            JOptionPane.showMessageDialog(null,"Não foi encontrado um paciente com este número de SUS.");
        } else {

            if (tipo == 0) {
                cadastraNovoProntuarioPA(paciente);
            } else {
                cadastraNovoProntuarioI(paciente);
            }

        }

    }
    
    private void cadastrarInexistente(){
        
        JanelaCadastroPaciente.getInstance().setVisible(true);
        
        //paciente = CadastroPaciente.getInstance().getLastP();
        
        /*if(tipo == 0){
            cadastraNovoProntuarioPA(paciente);
        }else{
            cadastraNovoProntuarioI(paciente);
        }*/
        
    }
    
    private void jMenuItem3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem3ActionPerformed
        PacienteJpaController jpa = new PacienteJpaController();
        String sus = JOptionPane.showInputDialog("Digite o número do Sus do Paciente.");
        paciente = jpa.findPacienteSus(sus);
        if(paciente == null){
            JOptionPane.showMessageDialog(null, "Paciente não encontrado.", "Erro", JOptionPane.ERROR_MESSAGE);
            return;
        }
        JanelaEdicaoVisualizacao tela = JanelaEdicaoVisualizacao.getInstance(paciente);        
        tela.setPessoa(pessoa);
        tela.setVisible(true);
    }//GEN-LAST:event_jMenuItem3ActionPerformed

    private void jMenuItem12ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem12ActionPerformed
        // TODO add your handling code here:
        cadastrarInexistente();
    }//GEN-LAST:event_jMenuItem12ActionPerformed

    private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem1ActionPerformed
        cadastrarExistente(0);
    }//GEN-LAST:event_jMenuItem1ActionPerformed

    private void jMenuItem2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem2ActionPerformed
        cadastrarExistente(1);
    }//GEN-LAST:event_jMenuItem2ActionPerformed

    private void limpaTabela(){
        
        DefaultTableModel tabela = (DefaultTableModel) jTable1.getModel();
        
        while(tabela.getRowCount() > 0){
            tabela.removeRow(0);
        }
    }
    
    private void jMenuItem5ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem5ActionPerformed
        //Pesquisa por nome
        
        limpaTabela();
        
        String nome = JOptionPane.showInputDialog("Digite o nome do paciente");
        String sobrenome = JOptionPane.showInputDialog("Digite o sobrenome do paciente (deixe em branco caso não saiba)");
        List<Paciente> l = null;
        PacienteJpaController cont = new PacienteJpaController();
        
        if(sobrenome == null || sobrenome.length() <= 2){
            l = cont.findPessoaNome(nome);
        }else{
            l = cont.findPessoaNome(nome, sobrenome);
        }
        
        DefaultTableModel tabela = (DefaultTableModel) jTable1.getModel();
        
        if (l != null) {
            for (Paciente p : l) {
                tabela.addRow(new Object[]{p.getNome(), p.getSus()});
            }
        }else{
            JOptionPane.showMessageDialog(null,"Não foram encontrados resultados para a sua busca");
        }
        
    }//GEN-LAST:event_jMenuItem5ActionPerformed

    private void jMenuItem7ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem7ActionPerformed
        
        limpaTabela();
        
        String cpf = JOptionPane.showInputDialog("Digite o CPF do paciente");
        PacienteJpaController cont = new PacienteJpaController();
        Paciente l = null;
        
        l = cont.findPacienteCpf(cpf);
        
        DefaultTableModel tabela = (DefaultTableModel) jTable1.getModel();
        
        if (l != null) {
            tabela.addRow(new Object[]{l.getNome(), l.getSus()});
        }
    }//GEN-LAST:event_jMenuItem7ActionPerformed

    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(JanelaProntuario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(JanelaProntuario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(JanelaProntuario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(JanelaProntuario.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                JanelaProntuario.getInstance().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenu jMenu2;
    private javax.swing.JMenu jMenu3;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenuItem jMenuItem1;
    private javax.swing.JMenuItem jMenuItem12;
    private javax.swing.JMenuItem jMenuItem2;
    private javax.swing.JMenuItem jMenuItem3;
    private javax.swing.JMenuItem jMenuItem5;
    private javax.swing.JMenuItem jMenuItem7;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
    // End of variables declaration//GEN-END:variables
    private static JanelaProntuario uniqueInstance = null;
    private Paciente paciente;
    private Pessoa pessoa;
}
